//
//  main.m
//  03-NSStringAndNSValue
//
//  Created by LL.F on 16/7/6.
//  Copyright © 2016年 LL.F. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
 
#if 0
    //1.查看头文件或者API(全称叫Application Programming Interfaces 应用程序编程接口),他们的初始化/构造器,基本上都放在一起
    //2.当我们拿到一个新的类,你需要去查看这个类的初始化或者是构造器
    /** 初始化(init) */
    NSString *string = [[NSString alloc] init];
    /** 便利构造器(string) */
    NSString *str = [NSString string];
    /** 获取字符串长度(length) */
    NSUInteger length = string.length;//无符号长整形
    /** 获取字符串中字符(character) */
    unichar c = [str characterAtIndex:1];
    /** 字符串是否相等(equal) */
    [str isEqualToString:string];
    /** 获取子串(sub) */
    [string substringFromIndex:0];
    [string substringToIndex:5];
    [string substringWithRange:NSMakeRange(2, 3)];
    /** 拼接字符串(append) */
    [string stringByAppendingString:@"fdsdp"];
    [string stringByAppendingFormat:@"fdsdf%@", str];
#endif
    
#if 0
    NSString *pathString = @"/user/local/bin";
    //如果字符串方法带有返回值, 操作的不是原字符串, 而是生成新的字符串
    pathString = [pathString stringByAppendingPathComponent:@"line.plist"];//PathComponent路径组成, 这个拼接方法, 自动在后面加一个斜线
    NSLog(@"%@", pathString);
    /** 替换字符串(replace) */
    [pathString stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"dfgdf"];
    /** 字符串对象转化为int类型(int) */
    NSInteger number = [pathString integerValue];
    NSLog(@"%ld", number);
    
    /** 字符串对象转化为其他数据类型, 例如double, float, BOOL等. */
    double doubleValue = [pathString doubleValue];
    NSLog(@"%lf", doubleValue);
    [pathString floatValue];
    [pathString boolValue];
    
    /** 字符串全部大写(uppercase) */
    NSString *str1 = pathString.uppercaseString;
    
    /** 字符串全部小写(lowercase) */
    NSString *str2 = pathString.lowercaseString;
    
    /** 字符串首字母大写(capitalized) */
    NSString *str3 = pathString.capitalizedString;
    /** 是否以指定字符串为前缀(prefix) */
    NSInteger pre = [pathString hasPrefix:@"asd"];
    /** 是否以指定字符串为后缀(suffix) */
    NSInteger suf = [pathString hasSuffix:@"xcv"];
    
//    {
//    
//        age : 10;
//    }
    //JSON数据中,这个10是NSNumber类型,而不是字符串
    
    int age = 5;
    NSNumber *numberA = [NSNumber numberWithInt:age];
    NSNumber *numberB = [[NSNumber alloc] initWithInt:age];
    NSNumber *numberC = @(age);//NSNumber类型的字面量是@(), NSString是@""
    
#endif
    
    //练习题
    // 1.330184198501184115 处理字符串, 取出他的出生年月, 并计算出年龄(不用具体)
    // 输出格式 1985年01月18日 年龄:31岁
    NSString *string = [NSString stringWithFormat:@"330184198501184115"];
    NSString *year = [string substringWithRange:NSMakeRange(6, 4)];
    NSString *month = [string substringWithRange:NSMakeRange(10, 2)];
    NSString *day = [string substringWithRange:NSMakeRange(12, 2)];
    int age = 2016 - [year intValue];
    NSNumber *age1 = [NSNumber numberWithInt:age];
    NSLog(@"%@年%@月%@日 年龄:%@岁", year, month, day, age1);
    
#if 1
    // 集合
    // 1.数组: 可变数组(NSMutableArray)与不可变数组(NSArray)
    /************************* 不可变数组 **********************/
    // 1). 数组主要是有序的存放元素的集合类型, 并且可以通过下标取值. 不可变数组只能取值, 可变数组可以进行增删改的操作. 注意: 数组中只能存放对象类型
    // 2). 初始化数组
    // <1> 初始化方法: initWithObjects... 后面填入的参数一定是对象类型而且是可变参数, C语言中的链表(后续讲), 顺序填入你需要的元素, 初始化结束以nil为判别标准.
    NSArray *arr1 = [[NSArray alloc] initWithObjects:@"老大", @"老二", nil, @"123", nil];//因为nil所以只存入了遇到了第一个nil之前的两个元素
    NSLog(@"%@", arr1);
    // <2> 构造器方法:
    NSArray *arr2 = [NSArray arrayWithObjects:@"laoda", @"laoer", @"123",nil];
    // <3> 字面量
    NSArray *arr3 = @[@"laoda", @"laoer", @"123"];
    NSLog(@"%@", arr3);
    //为什么推荐字面量: 字面量可以识别对象是否为空值(但一般的初始化方法不可以), 如果为空, 字面量会崩溃, 但是初始化方法会识别nil为结束, 并不会产生问题, 造成数据丢失.
    // 3). 相关取值
    // <1> arr.count 取得数组中元素的个数
    NSLog(@"%ld", arr1.count);// 结果为1
    // <2> 数组中取值,通过下标来取值
    NSString *numberString = [arr1 objectAtIndex:0];
    // <3> 语法糖 取值方式 快捷取值
    NSString *numberStr = arr1[0];
    // <4> 根据值取对应的下标
    NSUInteger indexOfObject = [arr1 indexOfObject:@"老大"];
    NSLog(@"%ld", indexOfObject);
    // <5> 判断对象是否存在于数组中
    BOOL isHavingObject = [arr1 containsObject:@"老大"];
    NSLog(@"%@", isHavingObject ? @"YES" : @"NO");//避免输出为0或1, 看的不直观
    // <6> 取数组中第0位的元素/最后一个元素(如果数组为空, 返回的对象为空, 并且不会崩溃)
    [arr1 firstObject];
    [arr2 lastObject];
    // 4). 不可变数组, 改变元素(会生成新的数组, 不会在原数组基础上修改)
    // 1> 数组添加一个新的元素
    arr1 = [arr1 arrayByAddingObject:@"老三"];//addObtect:是可变数组里的添加方法
    NSLog(@"arr1 = %@", arr1);
    // 2> 数组添加另外一个数组中的所有元素
    arr1 = [arr1 arrayByAddingObjectsFromArray:arr2];
    NSLog(@"arr1 = %@", arr1);
    
    /********************** 可变数组(NSMutableArray) ********************/
    // 1. 初始化方法前两个同不可变数组一样, 字面量创建方法如下(不推荐使用)
    NSMutableArray *mutableArray = [@[@"老大", @"老二"] mutableCopy];
    // 2. 取值方式与不可变数组一样
    // 3. 可变数组的改变元素
    // <1> 数组中添加元素 -> addObject
    [mutableArray addObject:@"123"];
    NSLog(@"mutableArray = %@", mutableArray);
    // <2> 数组中插入元素 -> insertObject: atIndex:
    [mutableArray insertObject:@"456" atIndex:1];
    NSLog(@"mutableArray = %@", mutableArray);
    // <3> 移除
    // 移除第0个元素
    [mutableArray removeObjectAtIndex:0];
    // 移除最后一个元素
    [mutableArray removeLastObject];
    // 移除所有元素
    [mutableArray removeAllObjects];
    // <4> 替换 (使用替换时,数组对应位置不能为空)
    [mutableArray replaceObjectAtIndex:0 withObject:@"含蓄"];
    NSLog(@"mutableArray = %@", mutableArray);
    
    // 可变与不可变的区别
    // 1. 可变是可以修改的; 但是不可变的不可以.
    // 2. 不可变调用改变的方法时, 会生成对象; 可变调用改变方法时, 在对象本身上进行修改
    // 3. 可变继承于不可变
    
    
    
#endif

#if 1
    // 将字符串根据某个子串, 截成数组, 根据哪个子串截取, 哪个子串就会消失.
    NSString *urlString = @"www.a123cb.com";
    NSArray *array = [urlString componentsSeparatedByString:@"."];//被指定字符串分离的部分, 组成了一个数组
    NSLog(@"%@", array);
    // 将数组根据某个字符串, 拼接成一个字符串.
    NSArray *nameArray = @[@"韩旭", @"老王", @"小李"];
    NSString *nameStr = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"%@", nameStr);

#endif
    
    
    
    
    
    return 0;
}
